#!/usr/bin/evn python
# -*- coding: utf-8 -*-
"""
-------------------------------------------------
   文件名称 :     g
   文件功能描述 :   功能描述
   创建人 :       小钟同学
   创建时间 :          2021/12/13
-------------------------------------------------
   修改描述-2021/12/13:
   求上下文管理着请求对象Request，会话对象Session，当前请求的app应用，
   为了保证在一个请求的周期内的任何时候任何地点访问到Request和Session,
   又不能发生循环导入的问题，flask使用代理对象request和session来代理当前请求的Request和Session。
   PS：代码主要参考值flask框架
-------------------------------------------------
"""
from grpcframe.exts.grpclocal.local import LocalStack,LocalProxy
from functools import partial
from grpcframe.exts.grpclocal.request import Request

# 请求上下文的
_request_ctx_stack = LocalStack()

def _lookup_req_object(name)->Request:
    # 返回栈顶原生对象
    top = _request_ctx_stack.top
    if top is None:
        raise RuntimeError("Working outside of request context")
    # "request"---返回RequestContext对象的request属性
    return getattr(top, name)

# 创建一个request的代理对象
# request作为一个代理对象，其指向的是当前的请求的请求上下文RequestContext对象的request属性，
# 即在请求上下文初始化的时候创建的请求对象，它是程序处理逻辑频繁需要的对象，
# 存储着几乎所有的请求数据信息，本质上是Request对象。生命周期为一次请求期间，当请求处理完成后被销毁；
#>>>---"request"---指向的RequestContext对象的request属性---为出现方法提示:Request
request:Request = LocalProxy(partial(_lookup_req_object, "request"))